package com.wyclabs.mq.eventbus;

/**
 * EventManager
 * @author Zhang WenTao
 * @version 2.0 modify at 2019年8月6日 添加广播类型事件投递, 与定向事件投递
 */
public interface EventManager {

    /**
     * 根据策略发布事件, 如果需要给指定几个服务发送事件, 使用{@link #publish(DirectionalEvent)}
     * @param event    事件 不能为null
     * @param strategy 策略 不能为null
     * @author Zhang WenTao
     * @version 1.0 create at 2019年4月10日
     */
    void publish(Event event, PublishStrategy strategy);

    /**
     * 发布定向事件, 事件将会被投递到指定服务下
     * @param event {@link DirectionalEvent}
     * @author Zhang WenTao
     * @version 1.0 create at 2019年8月6日
     */
    void publish(DirectionalEvent event);

    /**
     * PublishStrategy
     * @author Zhang WenTao
     * @version 2.0 modify at 2019年8月6日 添加广播类型事件投递
     */
    public enum PublishStrategy {

        /**
         * 本地事件发布 除参数错误外不会抛出异常
         */
        LOCAL,

        /**
         * 本地异步事件发布 除参数错误外不会抛出异常
         */
        ASYNC,

        /**
         * 通过RabbitMQ交换事件 事件可以进行重试消费, 注意消费者的幂等性
         */
        RABBIT_MQ,

        /**
         * 通过RabbitMQ交换事件, 但是事件会共享给其他服务
         */
        OVERALL;
    }

}
